package com.cskaoyan.javase.basic._2variable._5cast;

/**
 * 数据类型转换
 * 之前我们提到过，Java是强类型语言，一个变量必须明确它的数据类型， 并且数据类型一旦确定不能随意更改。
 * 但不能随意修改并不是不能更改，而是需要一定的条件:
 * Java中变量的数据类型由某一种转换为另一种，我们将这个过程叫做数据类型转换。
 *
 * 在java当中,无论是引用数据类型还是基本数据类型变量,都存在类型转换
 * 它们的类型转换,大的分类都是两大类:
 *      1.自动类型转换: 指的是编译器自动完成类型转换,无需程序员写额外代码.
 *      2.强制类型转换: 指的是必须由程序员手动写代码,完成类型转换,需要特殊的语法.
 *
 * 基本数据类型的类型转换
 * 首先要明确,布尔类型的boolean不参与类型转换,其它七种都参与类型转换
 *
 * 1.基本数据类型的自动类型转换
 *      发生条件/场景: 发生在"小取值范围"转换为"大取值范围"的数据类型之间。
 *          简单来说,就是"小" --> "大"
 *          取值范围由小到大: byte,short/char,int,long,float,double 其中double是最大的,byte是最小的
 *
 *      注意事项: 既然自动类型转换是自动完成的,那么它有没有风险,会不会出现问题?是不是一定安全的呢?
 *              实际上,基本数据类型的自动类型转换也是可能出现数据失真的
 *
 * 2.基本数据类型的强制类型转换
 *      发生条件/场景: 简单来说就是"大" --> "小"
 *      这个过程是极其容易出现数据失真情况的,所以是具有危险性的,是强转,编译器不会自动完成,需要程序员手动写代码完成
 *      语法:
 *    强转后的数据类型 变量名 = (强转后的数据类型)要强转的变量/常量;
 * 强转在使用时,一定要注意数据失真的问题,不要因为数据失真而导致程序错误,要谨慎使用它.
 *
 * @since 16:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 100默认当成int处理
        int num = 100;
        // 这里存在类型转换,int --> long,没有写额外代码,这是自动类型转换
        long num2 = 100;
        long num3 = num;

        // 0.1默认当成double处理
        double a = 0.1;
        // double --> float
        // float b = 0.1;
        // float b = a;

        // int --> float 自动类型转换仍然可能出现数据失真
        int num1 = 1234567891;
        float num1F = num1;
        System.out.println(num1F);


        // double --> float 强转
        double d1 = 0.1;
        float f1 = (float) d1;
        /*
            快捷键的使用
                1.强转的快捷键
                    a.报错处用"alt + 回车"
                    b.在要强转的变量后面写".cast"

                2.写赋值语句/带有"="的语句时
                    建议从右往左写
                    最好不要从左往右写
                    因为先写完右边,左边可以自动生成
                        a.快捷键 ctrl + alt + V
                        2.在右边写".var"
         */
        float f2 = (float) d1;
        float f3 = ((float) d1);
        int i = (int) d1;
        byte b = (byte) d1;
    }
}
